home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
076-100
/
disk_078
/
mandelvroom
/
savemand.c
< prev
Wrap
C/C++ Source or Header
|
1992-05-06
|
9KB
|
395 lines
/***************************************************************************
*
* MandelVroom Load/Save raw information
*
* Kevin L. Clague
*
* Copyright (C) 1987
*
**************************************************************************/
#include "mand.h"
extern struct NewScreen NewScreen;
extern struct Screen *screen;
extern struct ViewPort *vp;
extern float StartX,StartY,EndX,EndY;
extern SHORT Zoom;
extern SHORT CountX,CountY,MaxCount,*CountBase;
extern LONG NavTop,NavBot,NavLeft,NavRight;
extern SHORT NumContours, *ContourBase;
extern UBYTE *ColorBase;
extern SHORT SavePalette[], Inited;
extern ULONG CalcTime;
extern UBYTE MandType;
extern ULONG BorderType;
/*
* Save all the data needed to restore the system to current state.
*/
SaveCounts(SaveName)
char *SaveName;
{
FILE *SaveFile;
SHORT *CountPtr,Color;
ULONG i,Count,Word = 0;
USHORT Cur,t;
ULONG Version = VERSION;
char ErrMsg[80];
/*
* Change the mouse pointer to Sleepy pointer
*/
SetSleepyPointer();
/*
* open the desired file for writing
*/
SaveFile = fopen(SaveName,"w");
if (SaveFile == (FILE *) NULL) {
sprintf(ErrMsg, "Can't open file %s", SaveName);
DispErrMsg(ErrMsg, 0);
return(0);
}
/*
* if there is data to save, save it
*/
if (CountBase) {
/*
* Put out the file header
*/
fwrite((char *) "MAND", 4, 1, SaveFile);
/*
* Put out the revision number
*/
fwrite((char *) Version, sizeof(Version), 1, SaveFile);
/*
* Put out the location on the complex plane
*/
fwrite((char *) &StartX, sizeof(float), 1, SaveFile);
fwrite((char *) &StartY, sizeof(float), 1, SaveFile);
fwrite((char *) &EndX, sizeof(float), 1, SaveFile);
fwrite((char *) &EndY, sizeof(float), 1, SaveFile);
/*
* Put out the Maximum iteration count for a given point
*/
fwrite((char *) &MaxCount, sizeof(SHORT), 1, SaveFile);
/*
* Put out the generator type
*/
fwrite((char *) &MandType, sizeof(MandType), 1, SaveFile);
/*
* Put out the time it took to generate
*/
fwrite((char *) &CalcTime, sizeof(CalcTime), 1, SaveFile);
/*
* Put out the screen's viewmodes
*/
fwrite((char *) &screen->ViewPort.Modes,
sizeof(screen->ViewPort.Modes), 1, SaveFile);
/*
* Put out the number of bit planes
*/
fwrite((char *) &screen->BitMap.Depth,
sizeof(screen->BitMap.Depth), 1, SaveFile);
/*
* Put some window flags
*/
fwrite((char *) &BorderType, sizeof(BorderType), 1, SaveFile);
/*
* Save the Color Palette
*/
for (i = 0; i < 32; i++) {
Color = GetRGB4(vp->ColorMap, i);
fwrite((char *) &Color, sizeof(Color), 1, SaveFile);
}
/*
* Save the number of contours
*/
fwrite((char *) &NumContours, sizeof(NumContours), 1, SaveFile);
/*
* Save the contour's heights
*/
fwrite((char *) ContourBase, sizeof(SHORT), (long) NumContours, SaveFile);
/*
* Save the contour's pen numbers (Color is a misnomer)
*/
fwrite((char *) ColorBase, sizeof(UBYTE), (long) NumContours, SaveFile);
/*
* Put out the image dimensions
*/
fwrite((char *) &CountX, sizeof(SHORT), 1, SaveFile);
fwrite((char *) &CountY, sizeof(SHORT), 1, SaveFile);
/* Save count information in pseudo RLL format */
/* Bits 9-0 are iteration count. */
/* Bits 15-10 are how many iteration count of same height in a row */
i = CountX*CountY;
CountPtr = CountBase;
Cur = *CountPtr;
Count = 1;
while (--i) {
CountPtr++;
/*
* Count up how many in a row have same height
*/
if (Cur == *CountPtr) {
Count++;
} else {
/*
* Break it up into chunks of 64
*/
while (Count) {
if (Count > 63) {
t = 63 << 10 | Cur;
Count -= 63;
} else {
t = Count << 10 | Cur;
Count = 0;
}
fwrite(&t,sizeof(SHORT),1,SaveFile);
Word++;
}
Count = 1;
Cur = *CountPtr;
}
}
/*
* Break the last one up into chunks
*/
while (Count) {
if (Count > 63) {
t = 63 << 10 | Cur;
Count -= 63;
} else {
t = Count << 10 | Cur;
Count = 0;
}
fwrite(&t,sizeof(SHORT),1,SaveFile);
Word++;
}
} else {
DispErrMsg("No Picture to save",0);
fclose(SaveFile);
return(0);
}
fclose(SaveFile);
} /* SaveCounts */
/*
* Load the state of the program from file
*/
LoadCounts(LoadName)
char *LoadName;
{
FILE *LoadFile;
SHORT *CountPtr;
LONG i;
ULONG Count,Word = 0;
USHORT t;
USHORT ViewModes;
UBYTE Depth;
UBYTE Header[5];
ULONG Version;
char ErrMsg[80];
/*
* Change the mouse pointer to Sleepy pointer
*/
SetSleepyPointer();
LoadFile = fopen(LoadName,"r");
if (CountBase) {
FreeMem(CountBase,CountX*CountY*sizeof(SHORT));
CountBase = (SHORT *) NULL;
}
if (LoadFile == (FILE *) NULL) {
/*
* can't read a non-existant file
*/
sprintf(ErrMsg, "File %s not found", LoadName);
DispErrMsg(ErrMsg, 0);
return(-1);
} else {
/*
* Read and check the file header
*/
fread((char *) &Header[0], 4, 1, LoadFile);
Header[4] = '\0';
if (strcmp(&Header[0], "MAND") != 0) {
/*
* File of improper format
*/
sprintf(ErrMsg, "File %s is not a MAND file",LoadName);
DispErrMsg(ErrMsg, 0);
fclose(LoadFile);
return(-1);
} else {
/*
* Read in the version
*/
fread((char *) &Version, sizeof(Version), 1, LoadFile);
/*
* Read in the locationin the complex plane
*/
fread((char *) &StartX, sizeof(float), 1, LoadFile);
fread((char *) &StartY, sizeof(float), 1, LoadFile);
fread((char *) &EndX, sizeof(float), 1, LoadFile);
fread((char *) &EndY, sizeof(float), 1, LoadFile);
/*
* Read in the maximum iteration count for a given point
*/
fread((char *) &MaxCount, sizeof(SHORT), 1, LoadFile);
/*
* Read in the generator type
*/
fread((char *) &MandType, sizeof(MandType), 1, LoadFile);
/*
* Read in the calculation time
*/
fread((char *) &CalcTime, sizeof(CalcTime), 1, LoadFile);
/*
* Read in the screen's viewmodes
*/
fread((char *) &ViewModes, sizeof(ViewModes), 1, LoadFile);
/*
* Read in the number of bit planes
*/
fread((char *) &Depth, sizeof(Depth), 1, LoadFile);
/*
* Read in the window flags
*/
fread((char *) &BorderType, sizeof(BorderType), 1, LoadFile);
/*
* Read in the color palette information
*/
fread((char *) &SavePalette[0], sizeof(SHORT), 32, LoadFile);
/*
* Read in the number of contours
*/
fread((char *) &NumContours, sizeof(NumContours), 1, LoadFile);
/*
* Read in the heights
*/
fread((char *) ContourBase, sizeof(SHORT), (long) NumContours, LoadFile);
/*
* Read in the pen numbers (Color is a misnomer)
*/
fread((char *) ColorBase, sizeof(UBYTE), (long) NumContours, LoadFile);
/*
* Put out the image dimensions
*/
fread((char *) &CountX, sizeof(SHORT), 1, LoadFile);
fread((char *) &CountY, sizeof(SHORT), 1, LoadFile);
/*
* try to allocate the space for the picture's iteration counts
*/
CountBase = (SHORT *) AllocMem(CountX*CountY*sizeof(SHORT),0);
if (CountBase == (SHORT *) NULL) {
DispErrMsg("Can't load counts. Out of RAM!!",0);
fclose(LoadFile);
return(0);
}
CountPtr = CountBase;
/* Load count information in pseudo RLL format */
/* Bits 9-0 are iteration count. */
/* Bits 15-10 are how many iteration count of same height in a row */
i = CountX*CountY;
while (i > 0) {
Word++;
if (fread((char *) &t, sizeof(t), 1, LoadFile) == 0) {
DispErrMsg("Premature EOF on source file",0);
fclose(LoadFile);
return(0);
}
Count = t >> 10;
t = t & 0x3ff;
for (; Count > 0; Count--) {
*(CountPtr++) = t;
i--;
}
}
CalculateGaps();
}
}
/*
* Open a new screen
*/
NewScreen.ViewModes = ViewModes;
NewScreen.Depth = Depth;
Inited = 0;
CloseDisp();
Inited = 1;
OpenDisp();
/*
* Let's show it to them
*/
ReColor();
/*
* Set No ZOOM
*/
Zoom = 0;
fclose(LoadFile);
} /* NewLoadCounts */